"""基类待开发项目
1. 数据读取回传，大数据分片安全读取
2. 文件格式支持，解码
3. 正则表达智能匹配式
"""
import sys
import os
import json
import logging


class FileBase:
    """
    本类实现了文件管理的基础功能，是全部文件操作类的基类，包括路径计算，插件注册，路径查找等
    """
    def __init__(self):
        pass

    def register(self):
        """
        预留方法，当前无实现
        方法主要实现差价插件文件 注册
        """
        pass

    @ staticmethod
    def upPath(name, max_layer=5):
        """
        向上查找指定文件/文件夹路径
        :param name: 指定寻址目标名称，默认向上寻址
        :param max_layer: 寻址层级，默认寻址五个层级
        :return: 返回寻址目标位置,没有找到默认不返回

        """
        path = os.path.dirname(sys.executable) if getattr(sys, 'frozen', False) else os.path.dirname(__file__)
        for _ in range(max_layer):
            find_path = os.path.join(path, name)
            if os.path.exists(find_path):
                return find_path
            path = os.path.dirname(path)
        return False

    @staticmethod
    def join_path(*args):
        """
        方法提供了os.path.join的快捷访问的封装，使用方法和原join一致，直接输入路径字符串逗号隔开就行
        :param args:
        :return:
        """
        return os.path.join(*args)


class ConfigLoader(FileBase):
    def __init__(self):
        super().__init__()

    def Config(self, target: str = 'config.json', roootdirdectory = 'config'):
        """
        配置文件加载方法
        :param target: 目标配置文件名称，如果非json文件需要配置相关解码器
        :param roootdirdectory: 配置文件跟目录，默认config，自动寻址向上查找，具体见方法 app.file.base.FileBase.get_path() 方法
        :return: 返回完整配置文件数据
        """
        config_path = self.upPath(roootdirdectory) # 路径寻址
        if config_path is None: # 寻址未查找到目标
            logging.error(f'{roootdirdectory}未找到')
        path = self.join_path(config_path, target) # 构建路径
        with open(path, 'r', encoding = 'utf-8') as f:
            return json.load(f)

    def Style(self, target: str = 'style.qss', rootdirdectory = 'config'):
        """
        PySide6 样式文件加载器
        :param target: 目标样式文件名称，默认style.qss,如果非文本文件需配置相关解码器
        :param rootdirdectory: 样式文件跟目录，默认config，自动寻址向上查找，具体见方法 app.file.base.FileBase.get_path() 方法
        :return: 返回完整样式文件数据
        """
        style_path = self.upPath(rootdirdectory) # 路径寻址
        if style_path is None: # 寻址未找到目标
            logging.error('')
        path = self.join_path(style_path, target)
        with open(path, 'r', encoding='utf-8') as f:
            return f.read()